using System;

namespace EmitDebugging.Tests.Types
{
	public class SimpleReferenceType
	{
		public SimpleReferenceType()
		{
		}

		public SimpleReferenceType(string a)
			: this()
		{
		}

		private void CallMethods()
		{
			SimpleReferenceType.MethodThree(12, new SimpleValueType(), new SimpleValueType());
			
			var simple = new SimpleReferenceType();
			simple.MethodOne(1, new SimpleValueType());

			var s = "s";
			var g = Guid.NewGuid();
			var t = new SimpleValueType();
			simple.MethodTwo(ref s, ref g, ref t);

			simple.MethodFour<Guid, string, int>(Guid.NewGuid(), "hi", 44);

			var sa = new string[] {"a", "b", "c"};
			var ta = new SimpleValueType[] {new SimpleValueType()};
			simple.MethodFive(new string[] {"a", "b", "c"}, ref sa,
				new SimpleValueType[] {new SimpleValueType()}, ref ta);

			simple.MethodSix<string, string>(ref s, s);
		}

		public void MethodFive(string[] a, ref string[] b, SimpleValueType[] c, ref SimpleValueType[] d)
		{
		}

		public virtual void MethodFour<T, U, V>(T a, U b, V c)
		{
		}

		public string MethodOne(int a, SimpleValueType b)
		{
			return "this";
		}

		public static void MethodSeven<T>(T a)
		{
		}
		
		public void MethodSix<T, U>(ref T a, U b)
		{
		}

		public static void MethodThree(long a, params SimpleValueType[] b)
		{
		}

		public void MethodTwo(ref string x, ref Guid a, ref SimpleValueType b)
		{
		}
	}
}
